/*
 * ArchivoEspacioLibre.cpp
 *
 *  Created on: 18/09/2011
 *      Author: nacho
 */
#include "ArchivodeBloques.h"

	ArchivoEspacioLibre::ArchivoEspacioLibre(const std::string &filePath):archivo(filePath){}

	ArchivoEspacioLibre::~ArchivoEspacioLibre(){
		this->cerrar();
	}

	void ArchivoEspacioLibre::abrir(){
		this->archivo.abrir();
	}
	void ArchivoEspacioLibre::cerrar(){
			this->archivo.cerrar();
	}
	void ArchivoEspacioLibre::irAlPrincipio(){
		this->archivo.irAlPrincipio();
	}

    bool ArchivoEspacioLibre::leerBloque(unsigned int Pos, unsigned int & espacioLibre ){
		/*char * buffer = new char[sizeof(unsigned int)];
		if (this->archivo.leerBytes(Pos,sizeof(unsigned int),buffer)){
			espacioLibre = (unsigned int)*buffer;
			delete [] buffer;
			return true;
		}
		else{
			delete [] buffer;
			return false;
		}
		*/
    	return this->archivo.leerBytes(Pos,sizeof(unsigned int),(char*)&espacioLibre);
    }

    void ArchivoEspacioLibre::grabarBloque(unsigned int Pos, unsigned int espacioLibre ){

  		  this->archivo.grabarBytes(Pos,sizeof(unsigned int),(char*)&espacioLibre);
    }
	bool ArchivoEspacioLibre::Siguiente(unsigned int & nroBloque, unsigned int & espacioLibre){
		nroBloque = (unsigned int)(this->archivo.getPosLectura()/sizeof(unsigned int));
		return this->leerBloque(this->archivo.getPosLectura(),espacioLibre);
	}


	bool ArchivoEspacioLibre::espacioLibre(unsigned int nroBloque, unsigned int & espacioLibre){
		return this->leerBloque(nroBloque*sizeof(unsigned int),espacioLibre);
	}

	//Actualiza el archivo de metadata con los datos actualizados del bloque
	void ArchivoEspacioLibre::actualizarBloque(unsigned int nroBloque,unsigned int espacioLibre){
		 this->grabarBloque(nroBloque*sizeof(unsigned int),espacioLibre);
	}

	unsigned int ArchivoEspacioLibre::agregarBloque(unsigned int espacioLibre){
		return this->archivo.agregarBloque(sizeof(unsigned int),(char*)&espacioLibre);
	}
